package com.ll.base.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.util.Collection;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 标量工具类
 *
 * @author yinuo
 * @date 2018/12/15
 */
@Slf4j
public class ScalarUtil {
    /**
     * 字符串默认值
     */
    public static final String DEFAULT_DIAN = ".";
    /**
     * 字符串默认值
     */
    public static final String DEFAULT_STRING_VALUE = "";
    /**
     * 默认字符串分隔符
     */
    public static final String DEFAULT_STRING_SPLIT = ",";
    /**
     * 顿号
     */
    public static final String DEFAULT_DH = "、";
    /**
     * Integer默认值
     */
    public static final Integer DEFAULT_INTEGER_VALUE = 0;
    /**
     * Long 默认值
     */
    public static final Long DEFAULT_LONG_VALUE = 0L;

    public static String getDefaultValueIfNull(String value, String defaultValue) {
        return value != null ? value : defaultValue;
    }

    /**
     * 如果字符串为null则使用默认值
     *
     * @param value        值
     * @param defaultValue 默认值
     * @return
     */
    public static String getDefaultValueIfNullOrEmpty(String value, String defaultValue) {
        return isNotEmpty(value) ? value : defaultValue;
    }

    /**
     * 如果值为null则使用默认值
     *
     * @param value        值
     * @param defaultValue 默认值
     * @return
     */
    public static Integer getDefaultValueIfNull(Integer value, Integer defaultValue) {
        return value != null ? value : defaultValue;
    }

    /**
     * 如果值为null或者为空则使用默认值
     *
     * @param value        值
     * @param defaultValue 默认值
     * @return
     */
    public static Integer getDefaultValueIfNullOrEmpty(Integer value, Integer defaultValue) {
        return value != null && !DEFAULT_INTEGER_VALUE.equals(value) ? value : defaultValue;
    }

    /**
     * 判断String是否不为空
     *
     * @param value 值
     * @return boolean
     */
    public static boolean isNotEmpty(String value) {
        return !StringUtils.isEmpty(value);
    }

    /**
     * 判断String是否为空
     *
     * @param value 值
     * @return boolean
     */
    public static boolean isEmpty(String value) {
        return StringUtils.isEmpty(value);
    }


    /**
     * 判断Integer 是否不为空
     *
     * @param value 值
     * @return boolean
     */
    public static boolean isNotEmpty(Integer value) {
        return value != null && !DEFAULT_INTEGER_VALUE.equals(value);
    }

    /**
     * 判断Collection 是否不为空
     *
     * @param collection 集合
     * @return boolean
     */
    public static <T> boolean isNotEmpty(Collection<T> collection) {
        return collection != null && !collection.isEmpty();
    }

    /**
     * 判断Long是否为空或者为0
     *
     * @param value 值
     * @return boolean
     */
    public static boolean isEmptyOrZero(Long value) {
        return value == null || DEFAULT_LONG_VALUE.equals(value);
    }

    /**
     * 判断Long是否不为空
     *
     * @param value 值
     * @return boolean
     */
    public static boolean isNotEmpty(Long value) {
        return value != null && !DEFAULT_LONG_VALUE.equals(value);
    }

    public static boolean isEmpty(Long value) {
        return value == null || DEFAULT_LONG_VALUE.equals(value);
    }

    public static boolean isEmpty(Integer value) {
        return value == null || DEFAULT_INTEGER_VALUE.equals(value);
    }

    /**
     * 判断collection  是否为空
     *
     * @param collection 集合
     * @return boolean
     */
    public static <T> boolean isEmpty(Collection<T> collection) {
        return collection == null || collection.isEmpty();
    }


    public static <T, R> boolean isEmpty(Map<T, R> map) {
        return map == null || map.isEmpty();
    }

    public static <T, R> boolean isNotEmpty(Map<T, R> map) {
        return !isEmpty(map);
    }

    /**
     * 字符串转换为long
     *
     * @param value 值
     * @return long
     */
    public static long toLong(String value) {
        return toLong(value, DEFAULT_LONG_VALUE);
    }

    /**
     * 字符串转换为long
     *
     * @param value        值
     * @param defaultValue 默认值
     * @return long
     */
    public static long toLong(String value, long defaultValue) {
        long result = defaultValue;
        try {
            result = Long.parseLong(value);
        } catch (NumberFormatException exception) {
            log.warn("ScalarUtil.toLong is Error, value:{}", value);
        }
        return result;
    }

    private static final String regEx = "[^0-9]";

    public static Integer getIntByString(String value) {
        Integer courseIndex = null;
        try {
            Pattern p = Pattern.compile(regEx);
            Matcher m = p.matcher(value);
            courseIndex = Integer.parseInt(m.replaceAll("").trim());
        } catch (Exception e) {
            log.error("提取数字失败 ：{}", value);
            return null;
        }
        return courseIndex;
    }
}
